// app/controller/bank_transaction_controller.js
'use strict';

const Controller = require('egg').Controller;

class BankTransactionController extends Controller {
  // 获取银行流水列表
  async index() {
    const { ctx } = this;
    // 同时支持 limit 和 pageSize 参数
    const { page = 1, limit, pageSize, transactionNo, amount, startDate, endDate, supplierId, transactionType } = ctx.query;
    // 如果没有提供 limit，但提供了 pageSize，则使用 pageSize
    const effectiveLimit = limit || pageSize || 20;
    
    try {
      // 构建查询条件
      const where = {};
      
      // 添加组织过滤条件
      if (ctx.state.organizationId) {
        where.organizationId = ctx.state.organizationId;
      }
      
      if (transactionNo) {
        where.transactionNo = { [ctx.app.Sequelize.Op.like]: `%${transactionNo}%` };
      }
      if (amount) {
        where.amount = amount;
      }
      if (startDate || endDate) {
        where.transactionDate = {};
        if (startDate) {
          where.transactionDate[ctx.app.Sequelize.Op.gte] = new Date(startDate);
        }
        if (endDate) {
          where.transactionDate[ctx.app.Sequelize.Op.lte] = new Date(endDate);
        }
      }
      
      // 添加交易类型筛选（收入/支出）
      if (transactionType) {
        if (transactionType === 'income') {
          // 收入：金额大于0
          where.amount = { [ctx.app.Sequelize.Op.gt]: 0 };
        } else if (transactionType === 'expense') {
          // 支出：金额小于0
          where.amount = { [ctx.app.Sequelize.Op.lt]: 0 };
        }
      }
      
      // 如果提供了supplierId参数，则根据供应商名称查询
      if (supplierId) {
        const supplier = await ctx.model.SupplierModel.findByPk(supplierId);
        if (supplier) {
          // 使用精确匹配而不是模糊匹配
          where.payerName = supplier.name;
        }
      }

      // 分页查询
      const offset = (parseInt(page) - 1) * parseInt(effectiveLimit);
      const { rows, count } = await ctx.model.BankTransactionModel.findAndCountAll({
        where,
        order: [['transactionDate', 'DESC']],
        limit: parseInt(effectiveLimit),
        offset
      });

      ctx.page(rows, count, parseInt(page), parseInt(effectiveLimit));
    } catch (error) {
      ctx.logger.error('获取银行流水列表失败:', error);
      ctx.error(`获取银行流水列表失败: ${error.message}`);
    }
  }
  
  // 获取银行流水详情
  async show() {
    const { ctx } = this;
    const { id } = ctx.params;
    
    try {
      const transaction = await ctx.model.BankTransactionModel.findByPk(id);
      
      if (!transaction) {
        ctx.error('银行流水不存在', 404);
        return;
      }
      
      ctx.success(transaction);
    } catch (error) {
      ctx.logger.error('获取银行流水详情失败:', error);
      ctx.error('获取银行流水详情失败');
    }
  }
  
  // 创建银行流水
  async create() {
    const { ctx } = this;
    const transactionData = ctx.request.body;
    
    try {
      // 设置组织ID
      if (ctx.state.organizationId) {
        transactionData.organizationId = ctx.state.organizationId;
      } else {
        transactionData.organizationId = 1; // 默认组织ID
      }
      
      // 调用服务层方法
      const result = await ctx.service.bankTransactionService.createTransaction(transactionData);
      
      ctx.success(result, '银行流水创建成功');
    } catch (error) {
      ctx.logger.error('创建银行流水失败:', error);
      ctx.error(`创建银行流水失败: ${error.message}`);
    }
  }
  
  // 更新银行流水
  async update() {
    const { ctx } = this;
    const { id } = ctx.params;
    const transactionData = ctx.request.body;
    
    try {
      // 使用Joi验证服务进行参数验证
      // 首先验证ID
      const idValidation = ctx.service.validationService.validateId(parseInt(id));
      if (idValidation.error) {
        ctx.error(`参数验证失败: ${idValidation.error.message}`);
        return;
      }
      
      // 验证流水数据
      const validation = ctx.service.validationService.validateUpdateBankTransaction(transactionData);
      if (validation.error) {
        ctx.error(`参数验证失败: ${validation.error.message}`);
        return;
      }
      
      const transaction = await ctx.model.BankTransactionModel.findByPk(id);
      
      if (!transaction) {
        ctx.error('银行流水不存在', 404);
        return;
      }
      
      await transaction.update(transactionData);
      ctx.success(transaction, '银行流水更新成功');
    } catch (error) {
      ctx.logger.error('更新银行流水失败:', error);
      ctx.error('更新银行流水失败');
    }
  }
  
  // 删除银行流水
  async destroy() {
    const { ctx } = this;
    const { id } = ctx.params;
    
    try {
      const transaction = await ctx.model.BankTransactionModel.findByPk(id);
      
      if (!transaction) {
        ctx.error('银行流水不存在', 404);
        return;
      }
      
      await transaction.destroy();
      ctx.success(null, '银行流水删除成功');
    } catch (error) {
      ctx.logger.error('删除银行流水失败:', error);
      ctx.error('删除银行流水失败');
    }
  }
}

module.exports = BankTransactionController;